package com.estore;

import java.io.*;
import java.util.*;

/**
 * 商品服务类，负责商品相关的业务逻辑
 * 目前使用内存Map模拟数据库
 */
public class ProductService {

    // 使用Map存储商品数据，key是商品ID，value是商品对象
    // 优点：通过ID查找商品时，时间复杂度是O(1)，非常高效
    private  Map<String, Product> productData = new HashMap<>();
    private String dataFilePath;
    private String backupFilePath;
    /**
     * 构造函数，初始化一些商品数据
     */
    public ProductService(){
        loadData();
        if(productData.isEmpty()){
            System.out.println("未找到数据文件，正在初始化默认数据...");
            initDefaultData();
            saveData();
        }
    }
    private void initDefaultData() {
        productData.put("p001", new Product("p001", "Java从入门到精通", 99.0, 100,"热门","爆品"));
        productData.put("p002", new Product("p002", "高性能MySQL", 128.5, 50));
        productData.put("p003", new Product("p003", "颈椎康复指南", 45.0, 200));
        productData.put("p004", new Product("p004", "生发秘籍", 88.0, 0,"冷门")); // 库存为0的商品
        productData.put("p005", new Product("p005", "Java进阶开发实战", 100.0, 1));
        productData.put("p006", new Product("p006", "信息安全技术", 56.6, 10,"新品"));
        productData.put("p007", new Product("p007", "Python基本语法", 35.9, 28));
    }

    /**
     * 获取所有商品列表
     * @return 商品列表
     */
    public List<Product> getAllProducts() {
        // 从Map的值集合创建一个新的ArrayList并返回
        return new ArrayList<>(productData.values());
    }
    public Map<String,Product> getProductData() {
        // 从Map的值集合创建一个新的ArrayList并返回
        return productData;
    }
    /**
     * 根据ID查找商品
     * @param id 商品ID
     * @return 找到的商品对象，如果不存在则返回null
     */
    public Product findProductById(String id) {
        return productData.get(id);
    }
    public void loadConfig(){
        Properties props=new Properties();
        try(InputStream isr=ProductService.class.getClassLoader().getResourceAsStream("com/estore/config.properties")){
            props.load(isr);
            dataFilePath=props.getProperty("data.file.path");
            if(dataFilePath==null||dataFilePath.trim().isEmpty()){
                throw new IllegalArgumentException("配置项data未设置");
            }
            backupFilePath=props.getProperty("backup.file.path");
            if(backupFilePath==null||backupFilePath.trim().isEmpty()){
                throw new IllegalArgumentException("配置项backup未设置");
            }
        }catch (Exception e){
            e.printStackTrace();
            throw new RuntimeException("加载配置失败"+e.getMessage());
        }
    }
    public void backupData(){
        loadConfig();
        try (FileInputStream fis=new FileInputStream(dataFilePath);
             FileOutputStream fos=new FileOutputStream(backupFilePath)){
            int length;
            byte[] buffer=new byte[1024];
            while ((length=fis.read(buffer))!=-1){
                fos.write(buffer,0,length);
            }
            System.out.println("数据备份成功："+dataFilePath+"->"+backupFilePath);
        }catch (FileNotFoundException e){
            System.out.println("备份失败：源文件不存在-"+dataFilePath);
        }catch (IOException e){
            System.out.println("备份过程中发生错误："+e.getMessage());
        }
    }
    public void saveData(){
       loadConfig();
        try(ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(dataFilePath))){
            oos.writeObject(productData);
            System.out.println("提示：商品数据已成功保存到"+dataFilePath);
        }catch (IOException e){
            System.out.println("错误：保存商品数据失败"+e.getMessage());
        }
    }
    private void loadData(){
        loadConfig();
        File file=new File(dataFilePath);
        if(file.exists()){
            try (ObjectInputStream ois=new ObjectInputStream(new FileInputStream(file))){
               productData=(Map<String, Product>)ois.readObject();
                System.out.println("提示：商品数据已从"+dataFilePath+"加载。");
            }catch (IOException | ClassNotFoundException e){
                System.out.println("错误：加载商品数据失败"+e.getMessage());
            }
        }
        else {
            System.out.println("提示：数据文件"+dataFilePath+"不存在。");
        }
    }
}
